StupidBeauty
Read times:2021Posted at:Thu May 10 18:09:56 2012 - no title specified

Qt 5 . 7 文档翻译:QAbstractSocket类,QAbstractSocket Class

QAbstractSocket 类,实现了所有套接字类型对象公用的基础功能。 详细说明……

头文件:

#include <QAbstractSocket>

qmake指令

QT += network

继承

QIODevice

被以下类继承:

QTcpSocket QUdpSocket

注意 这个类中的所有函数都是 可重入的

详细说明

QAbstractSocket 类,实现了所有套接字类型对象公用的基础功能。

QAbstractSocket QTcpSocket QUdpSocket 的基类,实现 了这两个类共用的基础功能。如果 妳想使用套接字,那么,妳有两种选项:

传输控制协议TCP (Transmission Control Protocol)),是可靠的、面向流的、面向连接的传输层协议。用户数据报协议(UDP (User Datagram Protocol)),是不可靠的、面向数据包的、无连接的协议。从实用角度来说,这就意味着,TCP更适合于连续传输数据,而更轻量级的UDP就可用于可靠性不那么重要的场景。

QAbstractSocket 的应用编程接口,将两个协议之间大部分差别都统一了。比如 说,尽管 UDP 是无连接的,但是, connectToHost () 可以为UDP 套接字建立一个虚拟连接,使得 妳能够在一定程度上忽略底层 协议的不同,以一种比较统一的方式来使用 QAbstractSocket 在内部实现中, QAbstractSocket 会记录下传递给 connectToHost ()的地址和端口,之后, read ()和 write ()这样的函数就会使用那些值。

任何时候 QAbstractSocket 都有一个确定的状态 ( state ()函数返回 ) 。最初状态 UnconnectedState 在调用 connectToHost ()之后,套接字就进入 HostLookupState 状态。找到 主机之后, QAbstractSocket 进入 ConnectingState 状态 ,并且发射 hostFound ()信号。 当连接建立之后,它就进入 ConnectedState 状态,并且发射 connected ()信号。如果 在任何时候发生了错误,则会发射 error ()信号。每当状态 发生改变时,就会发射 stateChanged ()信号。 为了方便使用,提供了 isValid ()函数,当套接字已经可以被读取数据及写入数据时,该函数会返回真( true ),但是,请注意 ,套接字必须 进入 ConnectedState 状态 才能够 真正开始读取和写入。

通过调用 read () write ()来读取或写入数据,或者,可使用便利函数 readLine ()和 readAll ()。 QAbstractSocket 还从 QIODevice 继承了 getChar () putChar () ungetChar (),这些函数对单个字节进行操作。 当有数据被写入到套接字中去时,会发射 bytesWritten ()信号。注意 Qt 并不限制写入缓冲区的大小。 妳可通过监听这个信号来监视缓冲区的大小。

每当 有新的数据块到达时,就会发射 readyRead ()信号。然后 bytesAvailable () 会返回可供读取的数据的字节数。典型 的用法中,应当将 readyRead ()信号连接 到某个信号槽,并在那个信号槽中读取所有可用的数据。如果 妳没有一次性将所有数据读取的话,那么,剩下的数据仍然可以在日后读取,并且, 新到达的数据都会被追加到 QAbstractSocket 的内部读取缓冲区中。 要想限制读取缓冲区的大小,则调用 setReadBufferSize ()。

要关闭该套接字,则调用 disconnectFromHost ()。 QAbstractSocket 就会进入 QAbstractSocket::ClosingState 状态。 当队列中所有数据都被写入到套接字之后, QAbstractSocket 才真正关闭该套接字,进入QAbstractSocket::ClosedState 状态,并且发射 disconnected ()信号。如果 妳想要抛弃所有尚未写入 的数据,立即断开连接的话,则应当调用 abort ()。如果对端 主机关闭了连接,那么, QAbstractSocket 会发射 error( QAbstractSocket::RemoteHostClosedError )信号 ,在这个过程中套接字的状态仍然是 ConnectedState ,然后,会发射 disconnected ()信号。

可调用 peerPort ()和 peerAddress ()来获取到当前连接的对端节点的端口和地址。 peerName () ,返回对端节点的主机名,也就是之前传递给 connectToHost ()的名字。 localPort () localAddress () ,返回本地套接字的端口和地址。

QAbstractSocket 提供 了一组函数,它们会阻塞当前线程,直到特定的信号被发射为止。 这些函数,可用来实现阻塞式的套接字功能:

以下是一个示例:

int numRead = 0, numReadTotal = 0;

char buffer[50];

forever {

numRead  = socket.read(buffer, 50);

// 对刚 读入的数组做该做的事

numReadTotal += numRead;

if (numRead == 0 && !socket.waitForReadyRead())

break;

}

如果 waitForReadyRead() 返回 假(false),则表明,连接已经被关闭,或者发生了错误。

针对阻塞 式套接字编程,相比于针对非阻塞式套接字编程,是完全不同的。阻塞 式套接字,不需要有事件循环的存在,因而一般来说可以写出较简单的代码。然而 ,在图形用户界面的应用程序里,只能 在非图形用户界面的线程中使用阻塞式套接字,以避免冻结住用户界面。 参考 fortuneclient blockingfortuneclient 示例,以同时了解两种不同实现方式。

注意 我们反对将阻塞式函数和信号一起使用。应当使用其中一种。

QAbstractSocket 可与 QTextStream QDataStream 的流式操作符(operator<<() and operator>>())配套使用。 不过,有一个问题需要注意: 妳需要先确保有足够多的数据存在,才能使用operator>>()来读取它。

参考 QNetworkAccessManager QTcpServer

成员类型文档

enum QAbstractSocket::SocketError

这个枚举说明的是可能出现的套接字错误。

常量

说明

QAbstractSocket::ConnectionRefusedError

0

对方拒绝连接(或者连接超时)。

QAbstractSocket::RemoteHostClosedError

1

对方主机关闭咯连接。注意,客户端套接字(也就是此套接字)会在发送完远程主机关闭连接这一通知之后关闭。

QAbstractSocket::HostNotFoundError

2

未找到指定的主机地址。

QAbstractSocket::SocketAccessError

3

套接字操作失败,因为此程序不具有对应的权限。

QAbstractSocket::SocketResourceError

4

本机的系统资源不足(例如,打开的套接字太多)。

QAbstractSocket::SocketTimeoutError

5

套接字操作超时。

QAbstractSocket::DatagramTooLargeError

6

数据报超过咯操作系统的限制(这一限制最少可能达到8192 字节)。

QAbstractSocket::NetworkError

7

网络本身出错(例如,网线突然被拔出)。

QAbstractSocket::AddressInUseError

8

提供给 QAbstractSocket::bind ()的地址已经在使用当中,并且被设置成独占的。

QAbstractSocket::SocketAddressNo tAvailableError

9

提供给 QAbstractSocket::bind ()的地址不属于此主机。

QAbstractSocket::UnsupportedSocketOperationError

10

所请求的套接字操作在本地的操作系统中不被支持(例如,不支持IPv6)。

QAbstractSocket::ProxyAuthenticationRequiredError

12

这个套接字正在使用代理,而代理服务器要求进行认证。

QAbstractSocket::SslHandshakeFailedError

13

SSL/TLS 握手过程失败,因此连接被关闭(只在 QSslSocket 中使用)

QAbstractSocket::UnfinishedSocketOperationError

11

只被QAbstractSocketEngine 使用。上一个操作还没结束(仍然在后台进行)。

QAbstractSocket::ProxyConnectionRefusedError

14

无法与代理服务器通信,因为它拒绝连接。

QAbstractSocket::ProxyConnectionClosedError

15

与代理服务器的连接被突然(在连接到最终目的节点之前)关闭。

QAbstractSocket::ProxyConnectionTimeoutError

16

与代理服务器之间的连接超时,或者代理服务器在处于认证阶段时停止响应。

QAbstractSocket::ProxyNotFoundError

17

无法找到通过setProxy()设置的代理地址(或者程序本身的代理地址)。

QAbstractSocket::ProxyProtocolError

18

与代理服务器之间的连接商过程失败,因为代理服务器的回复内容是无法理解的。

QAbstractSocket::OperationError

19

尝试进行某个操作,而套接字本身处于一种不允许该操作的状态。

QAbstractSocket::SslInternalError

20

所使用的SSL库报告了一个内部错误。这一般是因为那个库的安装不正确或者配置不正确。

QAbstractSocket::SslInvalidUserDataError

21

提供了无效的数据(证书、密钥、加密算法等等),结果导致了SSL 库中发生错误。

QAbstractSocket::TemporaryError

22

发生了临时错误(例如,该操作会阻塞,而套接字本身是非阻塞的)

QAbstractSocket::UnknownSocketError

-1

未知错误。

参考 QAbstractSocket::error ()

enum QAbstractSocket:: SocketState

这个枚举描述的是一个套接字可能存在的不同状态。

常量

说明

QAbstractSocket::UnconnectedState

0

这个套接字没有连接。

QAbstractSocket::HostLookupState

1

这个套接字正在进行域名解析。

QAbstractSocket::ConnectingState

2

这个套接字已经开始建立连接。

QAbstractSocket::Connected State

3

已经建立连接。

QAbstractSocket::BoundState

4

这个套接字已经绑定到一个地址和端口。

QAbstractSocket::ClosingState

6

这个套接字即将关闭(可能还有数据要发送)。

QAbstractSocket::ListeningState

5

这个值是内部使用的。

参考 QAbstractSocket::state ()

成员函数文档

bool QAbstractSocket:: bind (const  QHostAddress  & address quint16 port  = 0,  BindMode mode  = DefaultForPlatform)

使用给定的绑定模式( BindMode mode 来绑定到地址 address 的端口 port

将这个套接字绑定到地址 address 的端口 port

对于UDP 套接字,当绑定后,每当 有 UDP 数据包到达指定的地址和端口时,就会发射 QUdpSocket::readyRead ()信号。所以 ,这个函数可用于编写UDP 服务器。

对于TCP套接字,可使用这个函数来指定要用哪个网卡发起向外的连接,在多网卡的环境下狠有用。

默认情况 下,该套接字会使用 DefaultForPlatform 这个绑定模式( BindMode )来绑定。如果 未指定端口号,则会选择一个随机的端口号。

如果绑定成功, 则这个函数会返回真( true ),并且该套接字会进入 BoundState 状态;否则 将返回假( false )。

此函数是从Qt 5.0 开始引入的。

void  QAbstractSocket:: close  ()  [virtual]

覆盖 QIODevice::close ()。

关闭为此套接字打开的输入/输出设备,断开此套接字与对方主机的连接,关闭套接字,重置主机名、地址、端口号和底层的套接字描述符。

参考 QIODevice::close (),以了解当一个输入/输出设备被关闭时会产生什么动作。

参考 abort ()

void  QAbstractSocket:: hostFound ()

在调用 connectToHost ()之后,当主机名的域名解析成功之后,会发射这个信号。

注意 从Qt 4.6.3开始, QAbstractSocket 可能会在 connectToHost ()被调用时直接发射出hostFound()信号,因为对应的DNS结果可能已经存在于缓存中了。

参考 connected ()

bool  QAbstractSocket:: setSocketDescriptor ( qintptr socketDescriptor SocketState socketState  = ConnectedState,  OpenMode openMode  = ReadWrite)

使用平台原生 的套接字描述符 socketDescriptor 来初始化 QAbstractSocket 如果 socketDescriptor 被当成一个有效的套接字描述符接受了,则返回真( true );否则返回 假( false )。 该套接字会以 openMode 模式打开,并且进入指定的 socketState 状态。读取 和写入缓冲区会被清空,会忽略掉任何队列数据。

注意 无法使用同一个原生套接字描述符来初始化两个抽象套接字对象。

参考 socketDescriptor ()

SocketState  QAbstractSocket:: state  () const

返回此套接字的状态。

参考 error ()


bool  QAbstractSocket:: waitForReadyRead  (  int msecs  = 30000 )  [virtual]

覆盖 QIODevice::waitForReadyRead ()。

这个函数会阻塞,直到发生这个情况:有新的数据到达,并且发射咯 readyRead() 信号。这个函数会在 msecs 毫秒之后超时;默认的超时时间是30000 毫秒。

如果 readyRead ()信号被发射,并且有新的数据可读的话,则此函数会返回真;否则它会返回假(可能是因为出错,也可能是因为此操作超时)。

参考 waitForBytesWritten ()

http://item.jd.com/10813343.html

Cute Girls

地铁偷摸

未知美人

未知美人

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands

 
Recent comments
2017年4月~2019年4月垃圾短信排行榜Posted at:Thu Sep 26 04:51:48 2024
Qt5.7文档翻译:QWebEngineCookieStore类,QWebEngineCookieStore ClassPosted at:Fri Aug 11 06:50:35 2023盲盒kill -9 18289 Grebe.20230517.211749.552.mp4